const axios = require("axios");
const { createSpinner } = require("nanospinner");
const git = require("git-promise");

class Init {
    templates = {};
    // 请求模板地址数据
    async checkTemplate(url) {
        const { data } = await axios.get(url);
        return data;
    }
    async setup(options) {
        // 当字符串模板时请求地址得到数据
        if (typeof options.template === "string") {
            const templates = await this.checkTemplate(options.template); // 获取模板数据
            if (templates) {
                this.templates = templates;
            }
        }
        await this.selectTemplate(this.templates);
    }
    // 选择模板操作
    async selectTemplate(templates) {
        const inquirer = (await import("inquirer")).default; // import("") es6 中动态导入
        // 选择交互操作
        const answers = await inquirer.prompt([
            {
                type: "input",
                name: "name",
                message: "请输入项目名",
                default: function () {
                    return "cmp-project";
                },
            },
            {
                type: "list",
                name: "template",
                message: "请选择模板",
                choices: Object.keys(templates), // 选择模板就是对象的属性名
            },
        ]);
        // console.log(answers); 得到含有项目名和模板对象
        const gitRepo = this.templates[answers.template]; // 获取用户选择的模板
        await this.downloadRepo(gitRepo, answers.name); // 进行下载操作
    }
    // 克隆下载模板项目包
    async downloadRepo(repoPath, localPath) {
        const spinner = createSpinner(); // 加载动画
        spinner.start({ text: "downloading\n" });
        // git 进行命令克隆下载
        await git(`clone ${repoPath} ./${localPath}`); // 参数一克隆地址，参数二下载到目录
        // 下载成功结束
        spinner.success({
            text: `cd ${localPath} & npm install & npm run dev`, // 结束提示语
        });
    }
}

module.exports = new Init();
